#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <cstdio>
#include <cstring>
#include <sys/types.h>
#include <sys/syscall.h>

using namespace std;

int count = 0;

void *startRoutine(void *args)
{
    while (true)
    {
        count++;
        sleep(1);
    }
    pthread_exit((void *)0);
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, startRoutine, nullptr);
    while (true)
    {
        cout << "count = " << count << endl;
        sleep(1);
    }
    pthread_join(tid, nullptr);
    return 0;
}

// // 线程执行的逻辑
// void *startRoutine(void *args)
// {
//     std::cout << "Thread executing" << std::endl;
//     while (1)
//     {
//         // 模拟线程执行的任务
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, startRoutine, nullptr);

//     // 等待一段时间后取消线程
//     sleep(2);
//     int result = pthread_cancel(tid);
//     if (result != 0)
//     {
//         std::cerr << "Failed to cancel thread" << std::endl;
//         return 1;
//     }

//     // 等待线程执行完毕
//     void *threadResult;
//     pthread_join(tid, &threadResult);
//     if (threadResult == PTHREAD_CANCELED)
//         std::cout << "Thread canceled" << std::endl;
//     else
//         std::cout << "Thread not canceled" << std::endl;
//     return 0;
// }

// // pthread_exit演示
// void *startRoutine(void *args)
// {
//     cout << "thread executing" << endl;
//     // ...
//     // 终止当前进程并返回值
//     pthread_exit(reinterpret_cast<void *>(111));
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, startRoutine, nullptr);

//     // 等待线程执行完毕
//     void *result=nullptr;
//     pthread_join(tid, &result); // void **__thread_return 是一个输出型参数

//     // 打印线程的返回值
//     cout << "thread return value : " << reinterpret_cast<intptr_t>(result) << endl;
//     return 0;
// }

// // 线程分离演示
// void *startRoutine(void *args)
// {
//     char *name = static_cast<char *>(args);
//     int count = 1;
//     while (count <= 2)
//     {
//         cout << name << " count = " << count << endl;
//         count++;
//         sleep(1);
//     }
// }
//
// int main()
// {
//     pthread_t tid1, tid2, tid3;
//     pthread_create(&tid1, nullptr, startRoutine, (void *)"thread 1");
//     pthread_create(&tid2, nullptr, startRoutine, (void *)"thread 2");
//     pthread_create(&tid3, nullptr, startRoutine, (void *)"thread 3");

//     // 倾向于：让主线程分离其它线程，也可以在其它线程执行流内进行分离
//     pthread_detach(tid1);
//     pthread_detach(tid2);
//     pthread_detach(tid3);

//     while (true) {}
//     return 0;
// }

// void *startRoutine(void *args)
// {
//     char *s = (char *)args;
//     cout << "I am " << s << " , pid : " << getpid() << " tid : " << pthread_self()<<endl;
//     sleep(2);
// }

// int main()
// {
//     pthread_t tid[5];
//     for (int i = 0; i < 5; i++)
//     {
//         char *buffer = (char *)malloc(128);
//         sprintf(buffer, "thread %d", i);
//         pthread_create(&tid[i], nullptr, startRoutine, buffer);
//     }
//     sleep(1);
//     cout << "mian thread   , pid : " << getpid() << " tid : " << pthread_self()<<endl;

//     for (int i = 0; i < 5; i++)
//     {
//         pthread_join(tid[i], nullptr);
//         cout << " thread " << i << " -> " << tid[i] << endl;
//     }
//     return 0;
// }
